package com.class04.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Modifier;

/**
 * @ClassDescription://
 * 定义四个增强方法，获取目标方法信息 返回值  异常对象
 * 1、定义方法  - 增强代码
 * 2、使用注解指定对应的位置
 * 3、配置切点表达式选中方法
 * 4、切面和ioc的配置
 * 5、开启aspectj注解的支持
 *
 * TODO: 2023/11/6  增强方法中获取目标方法信息
 * 1、全部增强方法中，获取目标方法的信息（方法名，参数，访问修饰符，所属的类的信息）
 * JoinPoint joinPoint  import org.aspectj.lang.JoinPoint;
 * joinPoint包含目标方法信息
 * 2、返回结果 - @AfterReturning (Object result) result接受返回结果
 * @AfterReturn(value = "execution(* com..impl.*.*(..))", returning="形参名即可")
 * 3、异常的信息  - (Throwable t) t接收异场信息
 * @AfterThrowing(value = "execution(* com..impl.*.*(..))",throwing="形参名称即可")
 * @JdkVersion: 17
 * @Author: yxy
 * @Created: 2023/11/6 8:20
 */
//@Component
//@Aspect
public class MyAdvice {
    @Before(value = "com.class04.pointcut.MyPointCut.pc()")
    public void before(JoinPoint joinPoint) {
//        1、获取方法属于的类信息
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
//        2、获取方法名称
        int modifiers = joinPoint.getSignature().getClass().getModifiers();
        String s = Modifier.toString(modifiers);
//       获取方法名
        String name = joinPoint.getSignature().getName();

//        3、获取参数列表
        Object[] args = joinPoint.getArgs();
        System.out.println("MyAdvice的前置通知");


    }
    @AfterReturning(value = "com.class04.pointcut.MyPointCut.pc()",returning = "rs")
    public void afterReturning(JoinPoint joinPoint,Object rs){
//        //        1、获取方法属于的类信息
//        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
//        System.out.println(simpleName);
////        2、获取方法名称
//        int modifiers = joinPoint.getSignature().getClass().getModifiers();
//        System.out.println(modifiers);
//        String s = Modifier.toString(modifiers);
//        System.out.println(s);
////       获取方法名
//        String name = joinPoint.getSignature().getName();
//        System.out.println(name);
//
////        3、获取参数列表
//        Object[] args = joinPoint.getArgs();
//        for (Object arg : args) {
//            System.out.println(arg);
//        }
    }
    @After("com.class04.pointcut.MyPointCut.pc()")
    public void after(JoinPoint joinPoint){
//        //        1、获取方法属于的类信息
//        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
//        System.out.println(simpleName);
////        2、获取方法名称
//        int modifiers = joinPoint.getSignature().getClass().getModifiers();
//        System.out.println(modifiers);
//        String s = Modifier.toString(modifiers);
//        System.out.println(s);
////       获取方法名
//        String name = joinPoint.getSignature().getName();
//        System.out.println(name);
//
////        3、获取参数列表
//        Object[] args = joinPoint.getArgs();
//        for (Object arg : args) {
//            System.out.println(arg);
//        }
    }
    @AfterThrowing(value = "com.class04.pointcut.MyPointCut.pc()", throwing= "throwable")
    public void afterThrowing(JoinPoint joinPoint,Throwable throwable){
        //        1、获取方法属于的类信息
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
        System.out.println(simpleName);
//        2、获取方法名称
        int modifiers = joinPoint.getSignature().getClass().getModifiers();
        System.out.println(modifiers);
        String s = Modifier.toString(modifiers);
        System.out.println(s);
//       获取方法名
        String name = joinPoint.getSignature().getName();
        System.out.println(name);

//        3、获取参数列表
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            System.out.println(arg);
        }
    }
}
